home *** CD-ROM | disk | FTP | other *** search
/ BBS in a Box 15 / BBS in a box XV-1.iso / Files / Internet / Misc / Uupc 3.1 sources.sit / uupc 3.1 sources Folder / Mac specific / Unix lib / ndir.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-04-19  |  4.0 KB  |  192 lines  |  [TEXT/KAHL]

  1. #ifdef THINK_C
  2. # include "unixlibproto.h"
  3. # include "stdlib.h"
  4. # include "string.h"
  5. #endif THINK_C
  6.  
  7. #include "ndir.h"
  8. #include <stdio.h>
  9.  
  10. #ifndef    THINK_C
  11. #include <pb.h>
  12. #endif    THINK_C
  13. #ifdef TEST
  14. #include <stdio.h>
  15. #define _DEBUG
  16. #include <max/debug.h>
  17. #endif
  18.  
  19. #include "ndir.proto.h"
  20.  
  21. /*
  22.  * support for Berkeley directory reading routine on a V7 file system
  23.  */
  24.  
  25. /*
  26.  * open a directory.
  27.  */
  28.  
  29. DIR *
  30. opendir(char *name) 
  31. {
  32.     static DIR dir;
  33.     register DIR *dirp = &dir;
  34.     register int fd;
  35.  
  36.     char         buf[255];
  37.     CInfoPBRec    cpb;
  38.     HParamBlockRec hpbr;
  39.     WDPBRec        wdpb;
  40.     int         err, currDir;
  41.  
  42.     /* remember current dir */
  43.     (void) GetVol((StringPtr) buf, &currDir);
  44.     /* fix name, and get volume reference number */
  45.  
  46.     cnvMac(name, buf);
  47.     
  48.     cpb.dirInfo.ioVRefNum = 0;
  49.     cpb.dirInfo.ioNamePtr = (StringPtr)CtoPstr(buf);
  50.     cpb.dirInfo.ioFDirIndex = 0;
  51.     cpb.dirInfo.ioDrDirID = 0L;
  52.  
  53. #ifdef TEST
  54.     fprintf( stderr, "opendir: %s\n", buf );
  55. #endif
  56.  
  57.     if ((err = PBGetCatInfo( &cpb, 0 )) != 0 ) {
  58.         printmsg(0, "opendir: PBGetCatInfo error %d on %s", err, name );
  59.         return((DIR *)NULL);
  60.     }
  61. /**** repeated calls to malloc fill up system heap [3/24/90 garym]
  62.     if((dirp=(DIR *)malloc(sizeof(DIR))) == (DIR *)NULL) {
  63.         fprintf(stderr, "opendir: couldn't malloc %d got 0x%x\n", sizeof(DIR), dirp);
  64.         return((DIR *)NULL);
  65.     }
  66. ****/
  67.     hpbr.volumeParam.ioVRefNum = 0;
  68.     hpbr.volumeParam.ioVolIndex = -1;
  69.     hpbr.volumeParam.ioNamePtr = (StringPtr) buf;
  70.     if ((err = PBHGetVInfo(&hpbr, FALSE)) != noErr) {
  71.         printmsg(0, "opendir: PBHGetVInfo error %d on %s", err, name );
  72.         return((int)NULL);
  73.     }    
  74.     dirp->ioVRefNum = hpbr.volumeParam.ioVRefNum;
  75.     dirp->ioDrDirID = cpb.dirInfo.ioDrDirID;
  76.     dirp->ioFDirIndex = 1;
  77.     dirp->currdir = currDir;
  78. #ifdef    UNDEF
  79.     wdpb.ioCompletion = NULL;
  80.     wdpb.ioNamePtr = NULL;
  81.     wdpb.ioVRefNum = cpb.dirInfo.ioVRefNum;
  82.     wdpb.ioWDProcID = APPSIGNATURE;
  83.     wdpb.ioWDDirID = cpb.dirInfo.ioDrDirID;
  84.     wdpb.ioWDIndex = wdpb.ioWDVRefNum = 0;
  85.     if (PBOpenWD(&wdpb, FALSE) != noErr) {
  86.         return((DIR *)NULL);
  87.     }
  88.     dirp->ioVRefNum = wdpb.ioVRefNum;    /* remember the WD id */
  89.     wdpb.ioVRefNum = 0;
  90.     if (SetVol((int)NULL, dirp->ioVRefNum ) != noErr) {
  91.         return((DIR *)NULL);
  92.     }
  93. #endif    UNDEF
  94. #ifdef TEST
  95.     fprintf( stderr, "opendir: # %ld\n", cpb.u.di.ioDrDirID );
  96. #endif
  97.  
  98.     return(dirp);
  99. }
  100.  
  101.  
  102. /*
  103.  * get next entry in a directory.
  104.  */
  105. struct direct *
  106. readdir(DIR *dirp)
  107. {
  108.     CInfoPBRec cpb;
  109.     int err;
  110.     static struct direct dir;
  111.  
  112. #ifdef TEST
  113.     fprintf( stderr, "readdir: v:%d d:%ld i:%d\n", 
  114.             dirp->ioVRefNum, dirp->ioDrDirID, dirp->ioFDirIndex );
  115. #endif
  116.     strcpy( dir.d_name, "" );
  117.     cpb.dirInfo.ioNamePtr = (StringPtr)dir.d_name;
  118.     cpb.dirInfo.ioVRefNum = dirp->ioVRefNum;
  119.     cpb.dirInfo.ioDrDirID = dirp->ioDrDirID;
  120.     cpb.dirInfo.ioFDirIndex = dirp->ioFDirIndex++;
  121.  
  122.     if ((err = PBGetCatInfo( &cpb, 0 )) != 0 ) {
  123. #ifdef TEST
  124.         fprintf( stderr, "readdir: err %d\n", err );
  125. #endif
  126.         return NULL;
  127.     }
  128.  
  129.     dir.d_ino = 0;
  130.     PtoCstr( dir.d_name );
  131.  
  132. #ifdef TEST
  133.     fprintf( stderr, "readdir: OK \"%s\"\n",  dir.d_name);
  134. #endif
  135.  
  136.     dir.d_namlen = strlen(dir.d_name);
  137.     dir.d_reclen = DIRSIZ(&dir);
  138.     return (&dir);
  139.     
  140. }
  141.  
  142. /*
  143.  * close a directory.
  144.  */
  145. void
  146. closedir(DIR *dirp) {
  147.     WDPBRec    wdpb;
  148. #ifdef    UNDEF    
  149.     (void) (NULL, dirp->currdir);
  150.     wdpb.ioCompletion = NULL;
  151.     wdpb.ioNamePtr = NULL;
  152.     wdpb.ioVRefNum = dirp->ioVRefNum;
  153.     wdpb.ioWDProcID = APPSIGNATURE;
  154.     wdpb.ioWDDirID = dirp->ioDrDirID;
  155.     wdpb.ioWDIndex = wdpb.ioWDVRefNum = 0;
  156.     PBCloseWD (&wdpb, FALSE);
  157. #endif    UNDEF
  158. /********** HOO BOY *************
  159.  If this is doing what I think it's doing, it's REALLY crazy-badness!
  160.     if(dirp != (DIR *)NULL)
  161.         free((char *)dirp);
  162.     else
  163.         fprintf(stderr, "closedir: tried to free NULL *directory\n");
  164.  ********************************/
  165. }
  166.  
  167.  
  168. #ifdef TEST
  169. #include <errno.h>
  170.  
  171. main(void)
  172. {
  173.     char command[100];
  174.  
  175.     struct DIR *dirp;
  176.     struct direct *dp;
  177.     
  178.     while(gets(command) != NULL) {
  179.  
  180.         fprintf( stderr, "test: %s\n", command );
  181.  
  182.         if ((dirp = opendir( command )) == NULL ) {
  183.             fprintf( stderr, "couldn't open dir %s\n", command );
  184.         }
  185.         while ((dp = readdir(dirp)) != NULL) 
  186.             fprintf( stderr, "%s", dp->d_name );
  187.  
  188.         closedir( dirp );
  189.     }
  190. }
  191. #endif
  192.